﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Web;
using Ext.Net;
using LibGlobal;
using Roles;

namespace ERP.Page
{
    public partial class Sys : System.Web.UI.Page
    {
        #region[Define]
        private readonly string pathFolderRoot = ConfigurationManager.AppSettings["FolderRoot"];
        #endregion

        #region[Controller]
        protected void Page_Load(object sender, EventArgs e)
        {
            CheckPermisstion();
            if (Session["login"] == null && Session["UserName"] == null)
            {
                Response.Redirect(@"../Login.aspx");
                Response.Cache.SetCacheability(HttpCacheability.NoCache);
                Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
                Response.Cache.SetNoStore();
            }
            else
            {
                lbServerNameTitile.Text = Session["UserName"].ToString();
                //Get MachineName
                lbMachineName.Text = Environment.MachineName;
                //Get Ip Address
                var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
                foreach (var networkInterface in networkInterfaces)
                {
                    lbIdAdress.Text =
                        GetLocalIPv4(networkInterface.NetworkInterfaceType != NetworkInterfaceType.Wireless80211
                            ? NetworkInterfaceType.Ethernet
                            : NetworkInterfaceType.Wireless80211);
                }
                //Get Session Status
                var o1 = Session["login"];
                if (o1 != null) lbSessionStatus.Text = o1.ToString();
            }
            if (!X.IsAjaxRequest)
            {
                GetFolderRoot(grFolder.Root);
            }
        }
        protected void linkFileManager_Click(object sender, DirectEventArgs e)
        {
            WindowFileManager.Show();
        }
        #endregion

        #region[Method]
        protected void btnCreateFolder_Click(object sender, DirectEventArgs e)
        {
            txtPath.Text = pathFolderRoot;
            txtFolderName.Text = string.Empty;
            hdPath.Text = string.Empty;
            WindowCreateFolder.Show();
        }
        protected void btnDelFolder_Click(object sender, DirectEventArgs e)
        {
            var sm = grFolder.GetSelectionModel() as CheckboxSelectionModel;
            if (sm != null)
                foreach (var row in sm.SelectedRows)
                {
                    try
                    {
                        if (FileExists(row.RecordID))
                        {
                            HTML.clsFormat.Alert_ERROR("Lỗi",
                                "Tập tin còn tồn tại trong thư mục.Vui lòng xoá tập tin trước !");
                        }
                        else
                        {
                            var pathUrl = Server.MapPath(pathFolderRoot + row.RecordID);
                            Directory.Delete(pathUrl);
                            HTML.clsFormat.Alert_INFO("Thông Báo", "Xoá thư mục thành công !");
                        }
                    }
                    catch (Exception ex)
                    {
                        HTML.clsFormat.Alert_ERROR("Thông Báo", ex.Message);
                    }
                }
            GetFolderRoot(grFolder.Root);
        }
        protected void btnUpload_Click(object sender, DirectEventArgs e)
        {
            if (String.IsNullOrEmpty(FileUploadPanel.FileName))
            {
                HTML.clsFormat.Alert_ERROR("Lỗi", "Không có tập tin được chọn !");
            }
            else if (String.IsNullOrEmpty(hdPath.Text))
            {
                HTML.clsFormat.Alert_ERROR("Lỗi", "Vui lòng chọn thư mục cần tải lên !");
            }
            else
            {
                if (FileNameExists(hdPath.Text + "/"))
                {
                    HTML.clsFormat.Alert_ERROR("Lỗi",
                        "Tên tập tin này đã tồn tại trong thư mục " + hdPath.Text +
                        " vui lòng đổi tên tập tin trước khi tải lên !");
                }
                else
                {
                    Upload(Server.MapPath(pathFolderRoot + hdPath.Text + "/"));
                    GetFile(hdPath.Text);
                }
            }
        }
        protected void btnRefreshFolder_Click(object sender, DirectEventArgs e)
        {
            var sm = grFolder.GetSelectionModel() as CellSelectionModel;
            hdPath.Text = string.Empty;
            GetFolderRoot(grFolder.Root);
            GetFile(string.Empty);
            if (sm != null) sm.ClearSelection();
        }
        protected void btnCreate_Click(object sender, DirectEventArgs e)
        {
            if (String.IsNullOrEmpty(txtFolderName.Text) && String.IsNullOrEmpty(txtPath.Text))
            {
                HTML.clsFormat.Alert_ERROR("Lỗi", "Vui lòng nhập vào tên thư mục để tạo mới");
            }
            else
            {
                try
                {
                    var pathUrl = Server.MapPath(pathFolderRoot + txtFolderName.Text);
                    txtPath.Text = pathUrl;
                    Directory.CreateDirectory(pathUrl);
                    HTML.clsFormat.Alert_INFO("Thông Báo",
                        "Thư mục " + txtFolderName.Text + " được khởi tạo thành công !");
                    WindowCreateFolder.Close();
                    GetFolderRoot(grFolder.Root);
                }
                catch (Exception ex)
                {
                    HTML.clsFormat.Alert_ERROR("Lỗi", ex.Message);
                }

            }
        }
        protected void btnCloseFolder_Click(object sender, DirectEventArgs e)
        {
            WindowCreateFolder.Close();
        }
        protected void btnSubmitSelect_Click(object sender, DirectEventArgs e)
        {
            foreach (var row in ImageView.SelectedRows)
            {
                lbFileName.Text = row.RecordID;
            }
        }
        protected void btnDelFile_Click(object sender, DirectEventArgs e)
        {
            try
            {
                if (String.IsNullOrEmpty(hdPath.Text) && String.IsNullOrEmpty(lbFileName.Text))
                {
                    HTML.clsFormat.Alert_ERROR("Lỗi", "Vui lòng chọn tập tin để xoá !");
                }
                else
                {
                    foreach (var row in ImageView.SelectedRows)
                    {
                        File.Delete(HttpContext.Current.Server.MapPath(pathFolderRoot + hdPath.Text + "/") +
                                    row.RecordID + "");
                    }
                    HTML.clsFormat.Alert_INFO("Thông Báo", "Xoá tập tin thành công !");
                    GetFile(hdPath.Text);
                }
            }
            catch (Exception ex)
            {
                HTML.clsFormat.Alert_ERROR("Lỗi", ex.Message);
            }
        }
        protected void btnClear_Click(object sender, DirectEventArgs e)
        {
            ImageView.DeselectAll();
            lbFileName.Text = string.Empty;
        }
        protected void btnViewFile_Click(object sender, DirectEventArgs e)
        {
            if (lbFileName.Text.EndsWith(".xls") || lbFileName.Text.EndsWith(".xlsx"))
            {
                var strURL = pathFolderRoot + hdPath.Text + "/" + "../../Img/Excel-icon.png";
                ImageFile.ImageUrl = strURL;
                WindowViewFile.Show();
            }
            else if (lbFileName.Text.EndsWith(".doc") || lbFileName.Text.EndsWith(".docx"))
            {
                var strURL = pathFolderRoot + hdPath.Text + "/" + "../../Img/Word-icon.png";
                ImageFile.ImageUrl = strURL;
                WindowViewFile.Show();
            }
            else if (lbFileName.Text.EndsWith(".pdf"))
            {
                var strURL = pathFolderRoot + hdPath.Text + "/" + "../../Img/PDF-icon.png";
                ImageFile.ImageUrl = strURL;
                WindowViewFile.Show();
            }
            else if (lbFileName.Text.EndsWith(".xml"))
            {
                var strURL = pathFolderRoot + hdPath.Text + "/" + "../../Img/XML-icon.png";
                ImageFile.ImageUrl = strURL;
                WindowViewFile.Show();
            }
            else if (lbFileName.Text.EndsWith(".txt"))
            {
                var strURL = pathFolderRoot + hdPath.Text + "/" + "../../Img/Text-icon.png";
                ImageFile.ImageUrl = strURL;
                WindowViewFile.Show();
            }
            else
            {
                var strURL = pathFolderRoot + hdPath.Text + "/" + lbFileName.Text;
                ImageFile.ImageUrl = strURL;
                WindowViewFile.Show();
            }
        }
        protected void btnDownload_Click(object sender, DirectEventArgs e)
        {
            try
            {
                var strURL = pathFolderRoot + hdPath.Text + "/" + lbFileName.Text;
                var req = new WebClient();
                var response = HttpContext.Current.Response;
                response.Clear();
                response.ClearContent();
                response.ClearHeaders();
                response.Buffer = true;
                response.AddHeader("Content-Disposition", "attachment;filename=\"" + Server.MapPath(strURL) + "\"");
                byte[] data = req.DownloadData(Server.MapPath(strURL));
                response.BinaryWrite(data);
                response.End();
            }
            catch (Exception ex)
            {
                HTML.clsFormat.Alert_ERROR("Lỗi", ex.Message);
            }
        }
        protected void btnCloseFileManager_Click(object sender, DirectEventArgs e)
        {
            WindowFileManager.Close();
        }
        protected void StoreFile_RefreshData(object sender, StoreReadDataEventArgs e)
        {
            GetFile(hdPath.Text);
        }
        //Double-Click
        protected void PathDb_Click(object sender, DirectEventArgs e)
        {
            var Name = e.ExtraParams["Name"];
            if (String.IsNullOrEmpty(Name) || Name == "Thư mục gốc")
            {
                HTML.clsFormat.Alert_ERROR("Thông Báo", "Vui lòng chọn thư mục con !");
            }
            else
            {
                GetFile(Name);
                hdPath.Text = Name;
            }
        }
        //Row-Click
        protected void Select_Rows(object sender, DirectEventArgs e)
        {
            foreach (var row in ImageView.SelectedRows)
            {
                lbFileName.Text = row.RecordID;
            }
        }
        #endregion

        #region[Method-FileManager]
        private void GetFolderRoot(NodeCollection nodes)
        {
            var pathRoot = Server.MapPath(pathFolderRoot);
            var dir = new DirectoryInfo(pathRoot);
            if (nodes == null)
            {
                nodes = new NodeCollection();
            }
            var root = new Node { Text = "Thư mục gốc" };
            nodes.Add(root);
            foreach (var items in dir.GetDirectories("*.*"))
            {
                var node = new Node
                {
                    NodeID = items.Name,
                    Text = items.Name,
                    Leaf = true,
                    Icon = Icon.Folder
                };
                root.Children.Add(node);
            }
        }
        private void GetFile(string File)
        {
            var pathUrl = Server.MapPath(pathFolderRoot + File + "/");
            var files = Directory.GetFiles(pathUrl);
            var data = new List<object>(files.Length);
            foreach (var fileName in files)
            {
                var fi = new FileInfo(fileName);
                if (fi.Name.EndsWith(".xls") || fi.Name.EndsWith(".xlsx"))
                {
                    data.Add(new
                    {
                        name = fi.Name,
                        url = pathFolderRoot + File + "/" + "../../Img/Excel-icon.png"
                    });
                }
                else if (fi.Name.EndsWith(".doc") || fi.Name.EndsWith(".docx"))
                {
                    data.Add(new
                    {
                        name = fi.Name,
                        url = pathFolderRoot + File + "/" + "../../Img/Word-icon.png"
                    });
                }
                else if (fi.Name.EndsWith(".pdf"))
                {
                    data.Add(new
                    {
                        name = fi.Name,
                        url = pathFolderRoot + File + "/" + "../../Img/PDF-icon.png"
                    });
                }
                else if (fi.Name.EndsWith(".xml"))
                {
                    data.Add(new
                    {
                        name = fi.Name,
                        url = pathFolderRoot + File + "/" + "../../Img/XML-icon.png"
                    });
                }
                else if (fi.Name.EndsWith(".txt"))
                {
                    data.Add(new
                    {
                        name = fi.Name,
                        url = pathFolderRoot + File + "/" + "../../Img/Text-icon.png"
                    });
                }
                else
                {
                    data.Add(new
                    {
                        name = fi.Name,
                        url = pathFolderRoot + File + "/" + fi.Name
                    });
                }
            }
            StoreFile.DataSource = data;
            StoreFile.DataBind();
        }
        private bool FileExists(string File)
        {
            var check = false;
            var pathUrl = Server.MapPath(pathFolderRoot + File + "/");
            var files = Directory.GetFiles(pathUrl);
            foreach (var fileName in files)
            {
                var fi = new FileInfo(fileName);
                if (fi.Exists)
                {
                    check = true;
                }
            }
            return check;
        }
        private bool FileNameExists(string File)
        {
            var check = false;
            var pathUrl = Server.MapPath(pathFolderRoot + File + "/");
            var files = Directory.GetFiles(pathUrl);
            foreach (var fileName in files)
            {
                var fi = new FileInfo(fileName);
                if (fi.Name == FileUploadPanel.FileName)
                {
                    check = true;
                }
            }
            return check;
        }
        private void Upload(string path)
        {
            try
            {
                string tpl;
                tpl = "Tập tin đã tải lên : {0} <br/>Dung lượng : {1} bytes";
                if (FileUploadPanel.HasFile)
                {
                    if (CheckFileType())
                    {
                        FileUploadPanel.PostedFile.SaveAs(path + FileUploadPanel.FileName);
                        X.Msg.Show(new MessageBoxConfig
                        {
                            Buttons = MessageBox.Button.OK,
                            Icon = MessageBox.Icon.INFO,
                            Title = "Thông báo",
                            Message =
                                string.Format(tpl, FileUploadPanel.PostedFile.FileName,
                                    FileUploadPanel.PostedFile.ContentLength)
                        });
                    }
                    else
                    {
                        X.Msg.Show(new MessageBoxConfig
                        {
                            Buttons = MessageBox.Button.OK,
                            Icon = MessageBox.Icon.ERROR,
                            Title = "Lỗi",
                            Message = "Tập tin " + FileUploadPanel.FileName.Split('.')[1] + " không được hỗ trợ !"
                        });
                    }
                }
                else
                {
                    X.Msg.Show(new MessageBoxConfig
                    {
                        Buttons = MessageBox.Button.OK,
                        Icon = MessageBox.Icon.ERROR,
                        Title = "Lỗi",
                        Message = "Không có tập tin được chọn"
                    });
                }
            }
            catch (Exception ex)
            {
                HTML.clsFormat.Alert_ERROR("Lỗi", ex.Message);
            }
        }
        private bool CheckFileType()
        {
            var check = FileUploadPanel.PostedFile.FileName.EndsWith(".zip") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".jpg") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".png") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".gif") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".txt") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".xls") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".xlsx") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".doc") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".docx") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".pdf") ||
                         FileUploadPanel.PostedFile.FileName.EndsWith(".xml");
            return check;
        }
        #endregion

        #region[Get-Ip-Local]
        /*
         * GetLocalIPv4(NetworkInterfaceType.Ethernet);Lấy địa chỉ IPv4 Cáp mạng
         * GetLocalIPv4(NetworkInterfaceType.Wireless80211);Lấy địa chỉ IPv4 Wifi
         */
        public string GetLocalIPv4(NetworkInterfaceType _type)
        {
            string output = "";
            foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
                {
                    foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
                    {
                        if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
                        {
                            output = ip.Address.ToString();
                        }
                    }
                }
            }
            return output;
        }
        #endregion

        #region[Permisstion]
        private void CheckPermisstion()
        {
            if (Session["login"] != null && Session["USer_Detail_Id"].ToString() != string.Empty)
            {
                #region[Modules-Main]
                var Is_PageQuanTriHeThong = SecurityServices.HasPermisstionPageMain(StringContent.QuanTriHeThong, int.Parse(Session["USer_Detail_Id"].ToString()), true);
                {
                    if (Is_PageQuanTriHeThong == false)
                    {
                        PanelQuanTriHeThong.Visible = false;
                    }
                }
                #endregion

                #region[Modules-Parrent]
                var Is_PageNhomQuyen = SecurityServices.HasPermisstionPageParrent(StringContent.NhomQuyen, int.Parse(Session["USer_Detail_Id"].ToString()), true);
                {
                    if (Is_PageNhomQuyen == false)
                    {
                        linkNhomQuyen.Visible = false;
                    }
                }
                var Is_PageModulesMain = SecurityServices.HasPermisstionPageParrent(StringContent.ModulesMain, int.Parse(Session["USer_Detail_Id"].ToString()), true);
                {
                    if (Is_PageModulesMain == false)
                    {
                        linkModulesMain.Visible = false;
                    }
                }
                var Is_PageModulesParent = SecurityServices.HasPermisstionPageParrent(StringContent.ModulesParent, int.Parse(Session["USer_Detail_Id"].ToString()), true);
                {
                    if (Is_PageModulesParent == false)
                    {
                        linkModulesParrent.Visible = false;
                    }
                }
                var Is_PageUserPermisstion = SecurityServices.HasPermisstionPageParrent(StringContent.UserPermisstion, int.Parse(Session["USer_Detail_Id"].ToString()), true);
                {
                    if (Is_PageUserPermisstion == false)
                    {
                        linkRoles.Visible = false;
                    }
                }
                var Is_PageUserManager = SecurityServices.HasPermisstionPageParrent(StringContent.UserManager, int.Parse(Session["USer_Detail_Id"].ToString()), true);
                {
                    if (Is_PageUserManager == false)
                    {
                        linkUser.Visible = false;
                    }
                }
                var Is_PageFileManager = SecurityServices.HasPermisstionPageParrent(StringContent.FileManager, int.Parse(Session["USer_Detail_Id"].ToString()), true);
                {
                    if (Is_PageFileManager == false)
                    {
                        linkFileManager.Visible = false;
                    }
                }
                #endregion
            }
        }
        #endregion
    }
}